package com.hson.demo.soa.util;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.hson.demo.soa.dto.activity.ActivityPrize;

/**
 * 精典抽奖算法 :使用单例线程改善用户体验.docx 【该文档中有更详细说明】 
 * @author:chenhs E-mail:hson08_chen@163.com
 * Created on 2017年6月8日 下午3:17:24
 */
public class LotteryUtil {

	/**
    * 抽奖
    *
    * @param orignalRates 原始的概率列表，保证顺序和实际物品对应
    * @return 物品的索引
    */
   public static int lottery(List<Double> orignalRates) {
       if (orignalRates == null || orignalRates.isEmpty()) {
           return -1;
       }

       int size = orignalRates.size();

       // 计算总概率，这样可以保证不一定总概率是1
       double sumRate = 0d;
       for (double rate : orignalRates) {
           sumRate += rate;
       }

       // 计算每个物品在总概率的基础下的概率情况
       List<Double> sortOrignalRates = new ArrayList<Double>(size);
       Double tempSumRate = 0d;
       for (double rate : orignalRates) {
           tempSumRate += rate;
           sortOrignalRates.add(tempSumRate / sumRate);
       }

       // 根据区块值来获取抽取到的物品索引
       double nextDouble = Math.random();
       sortOrignalRates.add(nextDouble);
       Collections.sort(sortOrignalRates);

       return sortOrignalRates.indexOf(nextDouble);
   }
   
   
   /**
 * @param args
 */
public static void main(String[] args) {
	   //奖品准备
	   List<ActivityPrize> apList = new ArrayList<ActivityPrize>();
	   ActivityPrize p1 = new ActivityPrize("100汤币", 5f);
	   ActivityPrize p2 = new ActivityPrize("80汤币", 10f);
	   ActivityPrize p3 = new ActivityPrize("50汤币", 15f);
	   ActivityPrize p4 = new ActivityPrize("30汤币", 20f);
	   ActivityPrize p5 = new ActivityPrize("20汤币", 20f);
	//   ActivityPrize p6 = new ActivityPrize("10汤币", 30f);
	   apList.add(p1);
	   apList.add(p2);
	   apList.add(p3);
	   apList.add(p4);
	   apList.add(p5);
	//   apList.add(p6);
	   
	   //中奖概率准备
	   List<Double> orignalRates = new ArrayList<Double>(apList.size());	   
	   orignalRates.add(5d);
	   orignalRates.add(10d);
	   orignalRates.add(15d);
	   orignalRates.add(20d);
	   orignalRates.add(20d);
	//   orignalRates.add(30d);
	   
	   int orignalIndex = lottery(orignalRates);
	   ActivityPrize ap = apList.get(orignalIndex);
	   System.out.println("中奖产品:"+ap.getName());
	   
	   Map<String, Object> map = new HashMap<String, Object>();
   }
   
}
